#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <ctime>
using namespace std;

// 1.验证什么时候把pending位图置为1?
// 2.验证一个信号会不会被重复捕捉？
// 3.验证关键字volatile
// 4.验证父进程等待子进程的时候是收到了17号信号
// 5.基于信号捕捉的异步进程等待
// 6.假设我一次性有10个进程要同时回收
// 7.或者我一次性有一半的进程要回收

// void PrintPending()
// {
//     sigset_t set;
//     sigpending(&set);
//     for(int signo = 31; signo >= 1; signo--)
//     {
//         if(sigismember(&set, signo))
//         {
//             cout << "1";
//         }
//         else
//         {
//             cout << "0";
//         }

//     }

//     cout << endl;
// }
// void handler(int signo)
// {
//     cout << "catch a signo: " << signo << endl;
//     while(true)
//     {
//         PrintPending();
//         sleep(1);
//     }
// }
// int main()
// {
//     signal(2, handler);
//     while(true)
//     {
//         cout << "I am a crazy process " << getpid() << endl;
//         sleep(1);
//     }
//     return 0;
// }

// volatile int cnt = 0;
// void handler(int signo)
// {
//     cout << "catch a signo " << signo << endl;
//     cnt = 1;
// }
// int main()
// {
//     signal(2, handler);
//     cout << "I am a crazy process" << getpid() << endl;
//     while(!cnt);
//     return 0;
// }

void handler(int signo)
{
    sleep(3);
    cout << "catch a signo " << signo << endl; 
    // waitpid(-1, nullptr, 0);
    // while(pid_t rid = waitpid(-1, nullptr, 0) > 0);
    while(pid_t rid = waitpid(-1, nullptr, WNOHANG) > 0);
}
int main()
{
    signal(17, handler);
    srand(time(nullptr));
    for(int i = 0; i < 10; i++)
    {
        pid_t id = fork();
        cout << "process create success" << endl;
        if (id == 0)
        {
            // child
            // int cnt = 5;
            // while (cnt)
            // {
            //     cout << "I am a child " << getpid() << endl;
            //     sleep(1);
            //     cnt--;
            // }
            sleep(rand()%5+3);
            cout << "process quit" << endl;
            exit(0);
        }

        sleep(rand()%5+3);
    }
    
    while(true)
    {
        cout << "I am farther " << getpid() <<  endl;
        sleep(1);
    }

    // int rid = waitpid(id, nullptr, 0);
    // if(rid == id)
    // {
    //     cout << "wait success" << endl;
    // }
    return 0;
}
